SWAGOLX.EXE (c) 1993 GDSOFT ALL RIGHTS RESERVED 00002 1 08-25-9409:10ALL TODD A. JACOBS Redirect output SWAG9408 ªb÷ 12 åu { From: tjacobs@clark.net (Todd A. Jacobs) }πunit Redir;π πinterfaceπ πusesπ Dos;π πfunction SetOutput(FileName: PathStr): Boolean;πprocedure CancelOutput;π πimplementationπ πconstπ OutRedir: Boolean = False;π πfunction SetOutput(FileName: PathStr): Boolean;πbeginπ FileName:=FileName+#0;π SetOutput:=False;π asmπ push dsπ mov ax, ssπ mov ds, axπ lea dx, FileName[1]π mov ah, 3Chπ int 21hπ pop dsπ jnc @@1π retπ@@1:π push axπ mov bx, axπ mov cx, Output.FileRec.Handleπ mov ah, 46hπ int 21hπ mov ah, 3Ehπ pop bxπ jnc @@2π retπ@@2:π int 21hπ end;π OutRedir:=True;π SetOutput:=True;πend;ππprocedure CancelOutput;πvarπ FileName: String[4];πbeginπ if not OutRedir then Exit;π FileName:='CON'#0;π asmπ push dsπ mov ax, ssπ mov ds, axπ lea dx, FileName[1]π mov ax, 3D01hπ int 21hπ pop dsπ jnc @@1π retπ@@1:π push axπ mov bx, axπ mov cx, Output.FileRec.Handleπ mov ah, 46hπ int 21hπ mov ah, 3Ehπ pop bxπ int 21hπ end;π OutRedir:=False;πend;ππend.π{πStandard output will be changed to FileName. The FileName can be NUL.πWhen yourπexecuted program is using int $10, all is hardly. In your main program use:ππSetOutput('NUL');πExec(....);πCancelOutput;π}ππ 2 08-25-9409:11ALL MATTHEW MASTRACCI EXEC with i/o redirectionSWAG9408 ╖└*ç 41 åu {πFrom: Matthew.Mastracci@matrix.cpubbs.cuug.ab.ca (Matthew Mastracci)ππ tf> A simple example:π tf> SwapVectors;π tf> Exec (GetEnv('comspec'), '/c dir *.* > FileName');π tf> SwapVectors;ππThis is a good way to do redirection for directory listings and the like,πbut a better way is to use this unit: (I wrote it from an idea given to me byπsomeone else posting the same sort of this, except this one includes errorπchecking and containm much more useful procedures) From this, you can go:ππSwapVectors;πRedirectOutput('\DIRLIST.TXT');πExec(GetEnv('COMSPEC'), '/C DIR *.*');πStdOutput;πSwapVectors;ππSame thing, but more control...ππHere's my REDIR.PAS unit:ππ Redirection unitππ - Original author unknown, rewritten by Matthew Mastracciπ - Added a bit of asm, pipe support, some better file handling ability, moreπ flexibilityπ - If you'd like some information on this program, E-Mail me at:π madhacker@matrix.cpubbs.cuug.ab.caπ - Feel free to distribute this source anywhere! (Public Domain)π}ππunit Redir;ππinterfaceππ{ Redirects standard input from a textfile/device ie: command < filename }πprocedure RedirectInput(TextFile : String);ππ{ Redirects standard output to a textfile/device ie: command > filename }πprocedure RedirectOutput(TextFile : String);ππ{ Redirects standard error to a textfile/device }πprocedure RedirectError(TextFile : String);ππ{ Redirects standard output and error to a textfile/device }πprocedure RedirectAllOutput(TextFile : String);ππ{ Redirects all I/O from a textfile ie: ctty device }πprocedure RedirectAll(TextFile : String);ππ{ Restores STDIN to CON }πprocedure StdInput;ππ{ Restores STDOUT to CON }πprocedure StdOutput;ππ{ Restores STDERR to CON }πprocedure StdError;ππ{ Creates a unique file and returns its name (used for piping) }πfunction UniqueFile : String;ππimplementationππuses Dos;ππvar InFile, OutFile, ErrFile : Text;ππconstπ STDIN = 0; { Standard Input }π STDOUT = 1; { Standard Output }π STDERR = 2; { Standard Error }π Redirected : array[0..2] of Boolean = (False, False, False);ππ{ Duplicates a file handle }πprocedure ForceDup (Existing, Second : Word);πvar f, Error : Word;πbeginπ asmπ mov ah, $46π mov bx, Existingπ mov cx, Secondπ int $21π pushfπ pop bxπ mov f, bxπ mov Error, axπ end;π if (f and FCarry) <> 0 thenπ Writeln ('Error ', Error, ' changing handle ', Second);πend;ππ{ Redirects standard input from a textfile/device ie: command < filename }πprocedure RedirectInput(TextFile : String);πbeginπ if Redirected[STDIN] then StdInput;π Redirected[STDIN] := True;π Assign(InFile, TextFile);π Reset(InFile);π ForceDup(TextRec(InFile).Handle, STDIN);πend;ππ{ Redirects standard output to a textfile/device ie: command > filename }πprocedure RedirectOutput(TextFile : String);πbeginπ if Redirected[STDOUT] then StdOutput;π Redirected[STDOUT] := True;π Assign(OutFile, TextFile);π Rewrite(OutFile);π ForceDup(TextRec(OutFile).Handle, STDOUT);πend;ππ{ Redirects standard error to a textfile/device }πprocedure RedirectError(TextFile : String);πbeginπ if Redirected[STDERR] then StdError;π Redirected[STDERR] := True;π Assign(ErrFile, TextFile);π Rewrite(ErrFile);π ForceDup(TextRec(ErrFile).Handle, STDERR);πend;ππ{ Redirects standard output and error to a textfile/device }πprocedure RedirectAllOutput(TextFile : String);πbeginπ RedirectOutput(TextFile);π RedirectError(TextFile);πend;ππ{ Redirects all I/O from a textfile ie: ctty device }πprocedure RedirectAll(TextFile : String);πbeginπ RedirectInput(TextFile);π RedirectOutput(TextFile);π RedirectError(TextFile);πend;ππ{ Restores STDIN to CON }πprocedure StdInput;πbeginπ if Redirected[STDIN] then beginπ Redirected[STDIN] := False;π RedirectInput('CON');π Close(InFile);π end;πend;ππ{ Restores STDOUT to CON }πprocedure StdOutput;πbeginπ if Redirected[STDOUT] then beginπ Redirected[STDOUT] := False;π RedirectOutput('CON');π Close(OutFile);π end;πend;ππ{ Restores STDERR to CON }πprocedure StdError;πbeginπ if Redirected[STDERR] then beginπ Redirected[STDERR] := False;π RedirectOutput('CON');π Close(OutFile);π end;πend;ππfunction UniqueFile : String;πconst FName : array[1..20] of Char = '\' + #0 + ' ';πvar FSeg, FOfs : Word;π FileName : String;πbeginπ FSeg := Seg(FName);π FOfs := Ofs(FName) + 1;π asmπ push dsπ mov ax, FSegπ mov ds, axπ mov dx, FOfsπ mov ah, $5aπ mov cx, 0π int $21π pop dsπ end;π Move(FName, FileName[1], 9);π FileName[0] := #9;π UniqueFile := FileName;πend;ππend.ππ{ This is how you can do piping. It is equivilent to: }π{ type \autoexec.bat | find "ECHO" | sort /R }ππ{$M $1000,0,0}πprogram PipeDemo;πuses Redir, Dos;πvar FName : String;ππbeginπ FName := UniqueFile;π WriteLn('Temporary file: ', FName);π WriteLn('Output from pipe:');π RedirectInput('\AUTOEXEC.BAT');π RedirectOutput(FName);π Exec('C:\DOS\FIND.EXE', '"ECHO"');π RedirectInput(FName);π RedirectOutput('CON');π Exec('C:\DOS\SORT.EXE', '/R');πend.π